React Native অ্যাপ্লিকেশনে Testing এবং CI/CD (Continuous Integration and Continuous Deployment) অত্যন্ত গুরুত্বপূর্ণ। এগুলি কোডের গুণগত মান নিশ্চিত করতে এবং দ্রুত ও নির্ভরযোগ্য ডিপ্লয়মেন্ট নিশ্চিত করতে সাহায্য করে। এই প্রক্রিয়া উন্নত অ্যাপ্লিকেশন ডেভেলপমেন্ট এবং প্রোডাকশনে একটিভ থাকাকেও সহজ করে তোলে।
নিচে React Native Testing এবং CI/CD নিয়ে বিস্তারিত আলোচনা করা হয়েছে।
React Native Testing
React Native অ্যাপ্লিকেশনের জন্য Testing গুরুত্বপূর্ণ কারণ এটি আপনাকে কোডের গুণগত মান বজায় রাখতে সাহায্য করে এবং সম্ভাব্য বাগ খুঁজে বের করতে সহায়ক। React Native-এ সাধারণত দুটি ধরনের টেস্টিং করা হয়: Unit Testing এবং End-to-End (E2E) Testing।
1. Unit Testing
Unit Testing হল এমন একটি টেস্টিং যেখানে কোডের ছোট ছোট অংশ (যেমন ফাংশন বা মেথড) টেস্ট করা হয়। React Native অ্যাপে Jest এবং Enzyme লাইব্রেরি ব্যবহার করে Unit Testing করা হয়।
Jest Setup:
Jest হল React Native অ্যাপ্লিকেশনের জন্য ডিফল্ট টেস্টিং ফ্রেমওয়ার্ক। এটি একটি JavaScript Testing Framework যা সহজে React Components টেস্ট করার জন্য ডিজাইন করা হয়েছে।
ইনস্টলেশন:
Jest স্বয়ংক্রিয়ভাবে React Native এর মধ্যে ইনস্টল থাকে। তবে আপনি যদি কনফিগারেশন পরিবর্তন করতে চান, তবে এটি ইনস্টল করতে পারেন:
npm install --save-dev jestUnit Test Example (Jest)
import React from 'react';
import { render } from '@testing-library/react-native';
import App from './App';
test('renders correctly', () => {
const { getByText } = render(<App />);
const textElement = getByText(/Welcome to React Native/i);
expect(textElement).toBeTruthy();
});এখানে, @testing-library/react-native ব্যবহার করা হয়েছে React Native components টেস্ট করতে। আমরা একটি সাধারিত টেক্সট টেস্ট করেছি যাতে নিশ্চিত হতে পারি যে এটি সঠিকভাবে রেন্ডার হচ্ছে।
2. End-to-End (E2E) Testing
End-to-End Testing এমন একটি টেস্টিং প্রক্রিয়া যেখানে পুরো অ্যাপের কার্যকারিতা পরীক্ষা করা হয়। React Native-এ Detox লাইব্রেরি ব্যবহার করে E2E Testing করা যায়।
Detox Setup:
Detox React Native এর জন্য একটি শক্তিশালী E2E Testing ফ্রেমওয়ার্ক। এটি অ্যাপের সমস্ত পারফরম্যান্স পরীক্ষা করে এবং নিশ্চিত করে যে অ্যাপ্লিকেশনটি ইউজার এক্সপেরিয়েন্স অনুযায়ী কাজ করছে।
ইনস্টলেশন:
npm install detox --save-devE2E Test Example (Detox)
describe('Example', () => {
it('should have welcome screen', async () => {
await expect(element(by.id('welcome'))).toBeVisible();
});
});এখানে, Detox ব্যবহার করে একটি অ্যাপের Welcome screen টেস্ট করা হয়েছে। Detox অ্যাপের UI ইন্টারঅ্যাকশন এবং পারফরম্যান্স পরীক্ষা করে।
CI/CD (Continuous Integration and Continuous Deployment)
CI/CD হচ্ছে একটি উন্নত প্র্যাকটিস যা কোড ডেভেলপমেন্ট প্রক্রিয়াকে দ্রুত এবং নির্ভরযোগ্য করে তোলে। Continuous Integration (CI) হল কোডের পরিবর্তনগুলি সার্ভারে নিয়মিতভাবে মার্জ করা এবং টেস্ট করা। Continuous Deployment (CD) হল স্বয়ংক্রিয়ভাবে প্রোডাকশনে কোড ডিপ্লয় করা।
React Native-এ CI/CD সেটআপ করার জন্য সাধারণত GitHub Actions, Bitrise, CircleCI, Jenkins, Travis CI ইত্যাদি টুলস ব্যবহৃত হয়।
CI/CD Tools Setup for React Native
- GitHub Actions for React Native CI/CD
GitHub Actions GitHub-এর নিজস্ব CI/CD টুল, যা সহজে React Native অ্যাপের জন্য CI/CD সিস্টেম তৈরি করতে সাহায্য করে।
GitHub Actions Workflow Example:
name: React Native CI/CD
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build the app
run: npm run android --variant=release
- name: Deploy to Play Store
run: ./deploy.shএখানে, GitHub Actions ব্যবহার করে React Native অ্যাপের জন্য একটি পুশ ট্রিগার সেট করা হয়েছে। এখানে টেস্ট চালানোর পর Android অ্যাপ তৈরি করা হবে এবং Play Store-এ ডিপ্লয় করা হবে।
- Bitrise for React Native CI/CD
Bitrise React Native অ্যাপের জন্য একটি জনপ্রিয় CI/CD টুল যা অ্যাপের বিল্ড এবং ডিপ্লয়মেন্ট প্রক্রিয়া স্বয়ংক্রিয়ভাবে পরিচালনা করে।
Bitrise Setup for React Native:
- Bitrise অ্যাকাউন্ট তৈরি করুন।
- আপনার React Native প্রজেক্ট Bitrise এ কানেক্ট করুন।
- Bitrise Workflow Editor ব্যবহার করে প্রোজেক্টের জন্য বিল্ড এবং টেস্ট স্টেপগুলো কনফিগার করুন।
Bitrise বিভিন্ন ধাপে automated testing, build automation, deployment, এবং releases সমর্থন করে।
- CircleCI for React Native CI/CD
CircleCI React Native অ্যাপ্লিকেশনের জন্য স্বয়ংক্রিয় বিল্ড, টেস্ট এবং ডিপ্লয়মেন্ট করতে ব্যবহৃত হয়।
CircleCI Workflow Example:
version: 2.1
jobs:
build:
docker:
- image: circleci/python:3.8
steps:
- checkout
- run:
name: Install Dependencies
command: npm install
- run:
name: Run Tests
command: npm test
- run:
name: Build Android
command: npm run android --variant=release
workflows:
version: 2
build:
jobs:
- buildএখানে, CircleCI ব্যবহার করে React Native অ্যাপের বিল্ড, টেস্ট এবং ডিপ্লয়মেন্টের জন্য একটি পিপলাইন কনফিগার করা হয়েছে।
সারাংশ
- React Native Testing: React Native অ্যাপের জন্য Unit Testing এবং E2E Testing করতে Jest এবং Detox লাইব্রেরি ব্যবহার করা হয়। Jest কম্পোনেন্ট লেভেল টেস্টিং এবং Detox পুরো অ্যাপের ফিচার টেস্টিং এর জন্য ব্যবহৃত হয়।
- CI/CD Setup: Continuous Integration (CI) এবং Continuous Deployment (CD) ব্যবহারের মাধ্যমে React Native অ্যাপের জন্য দ্রুত এবং নির্ভরযোগ্য বিল্ড, টেস্ট এবং ডিপ্লয়মেন্ট সিস্টেম তৈরি করা হয়। GitHub Actions, Bitrise, এবং CircleCI এই জন্য জনপ্রিয় টুলস।
Jest একটি অত্যন্ত জনপ্রিয় JavaScript testing framework যা unit testing, integration testing, এবং snapshot testing সহ বিভিন্ন ধরনের টেস্টিং সমর্থন করে। Jest, Facebook দ্বারা তৈরি, এবং এটি React অ্যাপ্লিকেশনগুলির জন্য ব্যাপকভাবে ব্যবহৃত হয়, তবে এটি JavaScript অ্যাপ্লিকেশনের অন্যান্য অংশেও ব্যবহৃত হতে পারে। Jest এর সহজ ব্যবহারের কারণে এটি অনেক ডেভেলপারদের পছন্দের টেস্টিং ফ্রেমওয়ার্ক।
এখানে আমরা Unit Testing এবং Integration Testing করার জন্য Jest ব্যবহার করার পদ্ধতি বিস্তারিতভাবে দেখাবো।
১. Unit Testing with Jest
Unit Testing হল একটি নির্দিষ্ট কোড ইউনিট (যেমন একটি ফাংশন, মেথড, অথবা ক্লাস) এর সঠিকতা পরীক্ষা করার প্রক্রিয়া। এটি সাধারণত খুব ছোট অংশের কোড পরীক্ষা করে এবং এতে সাধারণত বাইরের ডিপেন্ডেন্সি (API কল, ডেটাবেস ইত্যাদি) ব্যবহার করা হয় না।
Unit Test Example:
ধরা যাক, আমাদের একটি ফাংশন আছে যা দুটি সংখ্যা যোগ করবে:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;এখন, আমরা Jest ব্যবহার করে এই ফাংশনের ইউনিট টেস্ট লিখব।
// sum.test.js
const sum = require('./sum');
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
test('adds negative numbers correctly', () => {
expect(sum(-1, -2)).toBe(-3);
});
test('adds 0 + 0 to equal 0', () => {
expect(sum(0, 0)).toBe(0);
});ব্যাখ্যা:
test()হল Jest এর টেস্টিং ফাংশন, যেখানে প্রথম প্যারামিটার হচ্ছে টেস্টের নাম এবং দ্বিতীয় প্যারামিটার হচ্ছে একটি কলব্যাক ফাংশন যা আসল টেস্টিং লজিককে ধারণ করে।expect()হল Jest এর matcher ফাংশন, যা সত্য এবং মিথ্যা যাচাই করে।toBe()হল একটি matcher যা পরীক্ষা করে যে আসল মানটি প্রত্যাশিত মানের সমান কিনা।
Unit Testing Run:
আপনি Jest টেস্ট চালানোর জন্য টার্মিনালে নিচের কমান্ড ব্যবহার করতে পারেন:
npx jestএটি আপনার সব টেস্ট রান করবে এবং টেস্টের ফলাফল দেখাবে।
২. Integration Testing with Jest
Integration Testing হল বিভিন্ন কোড ইউনিটের সমন্বয়ে পুরো সিস্টেমের অংশ পরীক্ষা করা। এই পরীক্ষায় বিভিন্ন মডিউল বা ফাংশন একসাথে কাজ করছে কিনা তা পরীক্ষা করা হয়। সাধারণত এটি ব্যাকএন্ড API, ডাটাবেস এবং UI এর ইন্টিগ্রেশন চেক করে।
Integration Test Example:
ধরা যাক, আমাদের একটি ফাংশন আছে যা একটি API কল করে এবং ডাটাবেস থেকে তথ্য নিয়ে আসে। আমরা চাই যাতে API এবং ডাটাবেসের ইন্টিগ্রেশন সঠিকভাবে কাজ করে।
// fetchData.js
const axios = require('axios');
async function fetchData(url) {
try {
const response = await axios.get(url);
return response.data;
} catch (error) {
throw new Error('Error fetching data');
}
}
module.exports = fetchData;এখন, আমরা Jest এর মাধ্যমে এই API কলের ইন্টিগ্রেশন টেস্ট লিখবো। এই টেস্টে আমরা mocking ব্যবহার করব, যাতে প্রকৃত API কল না হয় এবং আমরা mocked response ব্যবহার করতে পারি।
// fetchData.test.js
const axios = require('axios');
const fetchData = require('./fetchData');
// Mocking axios.get method
jest.mock('axios');
test('fetches successfully data from API', async () => {
// Mock response data
axios.get.mockResolvedValue({ data: 'some data' });
const result = await fetchData('https://api.example.com/data');
expect(result).toBe('some data');
});
test('fetches data with error', async () => {
// Mock error
axios.get.mockRejectedValue(new Error('Error fetching data'));
await expect(fetchData('https://api.example.com/data')).rejects.toThrow('Error fetching data');
});ব্যাখ্যা:
- Mocking: আমরা
jest.mock()ব্যবহার করেছিaxiosএরget()মেথডটি মক করতে, যাতে প্রকৃত API কল না হয় এবং একটি mocked response বা mocked error প্রদান করা হয়। - mockResolvedValue(): এটি একটি মক ফাংশন যা resolved promise ফেরত দেয়।
- mockRejectedValue(): এটি একটি মক ফাংশন যা rejected promise ফেরত দেয়, সাধারণত error handling এর জন্য।
Integration Testing Run:
এই টেস্টও আপনি npx jest কমান্ডের মাধ্যমে রান করতে পারেন।
Mocking External Modules
এখানে axios এর মত বাইরের লাইব্রেরি বা মডিউলগুলোকে মক করার জন্য Jest mocking ব্যবহার করা হয়। আপনি যখন external dependencies যেমন API কল বা ডাটাবেস কোডের সঙ্গে কাজ করবেন, তখন মকিং করা খুবই গুরুত্বপূর্ণ, কারণ এতে আপনি real server বা network request ছাড়াই শুধু লজিক পরীক্ষা করতে পারবেন।
Mocking Example:
jest.mock('axios');এই কমান্ডটি axios এর সব মেথড মক করবে, যাতে আপনি আপনার টেস্টে মক রেসপন্স বা মক ত্রুটি ব্যবহার করতে পারেন।
Conclusion
- Unit Testing: একক ফাংশন বা কোড ইউনিটের সঠিকতা যাচাই করা। এতে বাইরের ডিপেন্ডেন্সি বা ইন্টিগ্রেশন ব্যবহার করা হয় না।
- Integration Testing: একাধিক কোড ইউনিট বা সিস্টেমের সমন্বয়ে কাজ করার সময় সঠিকভাবে কাজ করছে কিনা তা যাচাই করা। এখানে বাইরের সেবা বা API এর সঙ্গে ইন্টিগ্রেশন পরীক্ষা করা হয়।
- Jest একটি শক্তিশালী এবং সহজ টেস্টিং টুল যা
mockingএবংsnapshot testingএর মত ফিচার সহ খুব কার্যকরী।
Jest ব্যবহারে আপনি unit এবং integration testing খুব সহজেই করতে পারবেন এবং আপনার অ্যাপ্লিকেশনের কোডের সঠিকতা নিশ্চিত করতে পারবেন।
React Native Testing Library (RNTL) হলো একটি টুল যা React Native অ্যাপ্লিকেশনগুলির UI টেস্ট করার জন্য ব্যবহৃত হয়। এটি আপনাকে ব্যবহারকারী কীভাবে আপনার অ্যাপ্লিকেশন ব্যবহার করবে, সেই দৃষ্টিকোণ থেকে টেস্ট করতে সাহায্য করে। এর মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের ইউজার ইন্টারফেসের (UI) কার্যকারিতা এবং আচরণ যাচাই করতে পারবেন।
RNTL এর মূল লক্ষ্য হলো ইউজার ইন্টারফেসের বিভিন্ন এলিমেন্টকে টেস্ট করা এবং এটি একেবারে ডোম উপাদান নয়, বরং অ্যাপ্লিকেশনটি ব্যবহারকারীর মতো ইন্টারঅ্যাক্ট করে টেস্ট করতে সহায়ক।
React Native Testing Library এর ইনস্টলেশন
প্রথমে, আপনার React Native প্রোজেক্টে React Native Testing Library এবং Jest (যা স্বয়ংক্রিয়ভাবে React Native প্রোজেক্টে অন্তর্ভুক্ত থাকে) ইনস্টল করতে হবে।
npm install --save-dev @testing-library/react-nativeএছাড়া Jest এর কিছু প্রয়োজনীয় প্যাকেজ এবং ডিপেনডেন্সি আপডেট করা থাকতে পারে, যেমন:
npm install --save-dev jest react-test-renderer @testing-library/jest-nativeUI টেস্টিং এর জন্য কিছু মৌলিক কনসেপ্ট
- Render:
render()ফাংশনটি কম্পোনেন্ট রেন্ডার করতে ব্যবহৃত হয়। এর মাধ্যমে আপনি টেস্ট কম্পোনেন্টের UI কনটেন্ট পরীক্ষা করতে পারেন। - Query:
findByText,findByTestId,getByPlaceholderTextইত্যাদি প্রশ্নের মাধ্যমে আপনি কম্পোনেন্টের এলিমেন্ট খুঁজে বের করতে পারেন। - Event: ব্যবহারকারী ইন্টারঅ্যাকশনের জন্য
fireEventব্যবহার করা হয়, যেমন বাটন ক্লিক করা বা ইনপুট ফিল্ডে টাইপ করা।
Basic UI Test Example (React Native)
ধরা যাক, আপনার একটি সিম্পল React Native অ্যাপ আছে, যেখানে একটি বাটন ক্লিক করার পর একটি টেক্সট পরিবর্তন হয়। আপনি এই অ্যাপটি React Native Testing Library ব্যবহার করে টেস্ট করবেন।
Component: CounterButton.js
import React, { useState } from 'react';
import { View, Text, Button } from 'react-native';
const CounterButton = () => {
const [count, setCount] = useState(0);
return (
<View>
<Text testID="counterText">{count}</Text>
<Button
title="Increase Counter"
onPress={() => setCount(count + 1)}
/>
</View>
);
};
export default CounterButton;এটি একটি সিম্পল কম্পোনেন্ট যা একটি count ভেরিয়েবলকে হ্যান্ডেল করে এবং ব্যবহারকারী যখন বাটন ক্লিক করবে, তখন কনটেন্ট বেড়ে যাবে।
Test: CounterButton.test.js
import React from 'react';
import { render, fireEvent } from '@testing-library/react-native';
import CounterButton from './CounterButton'; // কম্পোনেন্টটি ইমপোর্ট
describe('CounterButton', () => {
test('increments counter when button is pressed', () => {
// Render the component
const { getByText, getByTestId } = render(<CounterButton />);
// Find the button and the initial counter text
const button = getByText('Increase Counter');
const counterText = getByTestId('counterText');
// Initial count should be 0
expect(counterText.props.children).toBe(0);
// Simulate pressing the button
fireEvent.press(button);
// After pressing the button, the count should increase to 1
expect(counterText.props.children).toBe(1);
});
});ব্যাখ্যা:
render(): এটিCounterButtonকম্পোনেন্টকে রেন্ডার করে এবং আমাদের উপাদানগুলোকে টেস্টের জন্য প্রস্তুত করে।getByText()এবংgetByTestId(): এই ফাংশনগুলির মাধ্যমে আমরা বাটন এবং কাউন্টার টেক্সটকে সিলেক্ট করি।getByTextটেক্সটের মাধ্যমে এলিমেন্ট খুঁজে পায় এবংgetByTestIdকম্পোনেন্টেtestIDঅ্যাট্রিবিউট দিয়ে সিলেক্ট করতে সাহায্য করে।fireEvent.press(): এটি ব্যবহারকারীর ইন্টারঅ্যাকশন সিমুলেট করে, যেমন বাটন ক্লিক করা।expect(): এটি Jest এর assertions ফাংশন, যা আপনার প্রত্যাশিত ফলাফল চেক করতে ব্যবহৃত হয়। আমরা চেক করছি যে কাউন্টারটি সঠিকভাবে ইঙ্ক্রিমেন্ট হয়েছে কিনা।
UI টেস্টিং এর অন্যান্য কেস
1. ইনপুট ফিল্ডে টেক্সট টাইপ করা
import React from 'react';
import { render, fireEvent } from '@testing-library/react-native';
import { TextInput, Button } from 'react-native';
test('should update text input value on change', () => {
const { getByPlaceholderText } = render(
<TextInput placeholder="Type here" />
);
const input = getByPlaceholderText('Type here');
// Simulate typing into the input field
fireEvent.changeText(input, 'Hello World');
// Check if the input value is updated correctly
expect(input.props.value).toBe('Hello World');
});2. Visibility Checking
import React from 'react';
import { render, fireEvent } from '@testing-library/react-native';
import { Text, Button } from 'react-native';
const ToggleText = () => {
const [visible, setVisible] = React.useState(false);
return (
<React.Fragment>
{visible && <Text testID="text">This is visible now!</Text>}
<Button title="Toggle Text" onPress={() => setVisible(!visible)} />
</React.Fragment>
);
};
test('should toggle text visibility on button press', () => {
const { getByText, queryByTestId } = render(<ToggleText />);
// Initially, text should not be visible
expect(queryByTestId('text')).toBeNull();
// After button press, text should be visible
fireEvent.press(getByText('Toggle Text'));
expect(queryByTestId('text')).toBeTruthy();
});সারাংশ
- React Native Testing Library ব্যবহার করে আপনি UI এর কার্যকারিতা এবং ইন্টারঅ্যাকশন টেস্ট করতে পারেন।
render()ফাংশনটি কম্পোনেন্ট রেন্ডার করে,fireEventব্যবহার করে আপনি ইউজারের ইন্টারঅ্যাকশন সিমুলেট করতে পারেন।- Queries যেমন
getByText,getByTestId,findByTextব্যবহার করে আপনি সহজেই UI উপাদান খুঁজে বের করতে পারেন এবং তাদের আচরণ পরীক্ষা করতে পারেন। - Jest এর মাধ্যমে টেস্টগুলি চালানো হয়, যা অ্যানালাইসিস এবং ভুল শনাক্তকরণে সহায়ক।
এইভাবে, React Native Testing Library দিয়ে UI টেস্টিং করলে আপনার অ্যাপের UI সঠিকভাবে কাজ করছে কিনা, তা নিশ্চিত করা যায় এবং ব্যবহারকারী ইন্টারঅ্যাকশন সঠিকভাবে হ্যান্ডেল হচ্ছে কিনা তা যাচাই করা যায়।
Detox হল একটি জনপ্রিয় End-to-End (E2E) Testing ফ্রেমওয়ার্ক যা React Native অ্যাপ্লিকেশনগুলির জন্য ব্যবহৃত হয়। এটি মূলত অ্যাপ্লিকেশনটির ইন্টারফেস এবং ফাংশনালিটি টেস্ট করার জন্য ডিজাইন করা হয়েছে, যা আপনার অ্যাপের রিয়েল টাইম ব্যবহারকারীর মত আচরণ করে এবং বিভিন্ন ইন্টারঅ্যাকশন পরীক্ষা করে। Detox ব্যবহার করে আপনি আপনার React Native অ্যাপের মধ্যে UI ইন্টারঅ্যাকশন যেমন বাটন প্রেস, ফর্ম ফিলিং, স্ক্রলিং ইত্যাদি পরীক্ষা করতে পারেন।
Detox এর বৈশিষ্ট্য
- UI Testing: অ্যাপ্লিকেশনটির ইউজার ইন্টারফেস টেস্ট করতে পারে, যেমন বাটন টিপানো, টেক্সট ইনপুট করা, বা স্ক্রলিং করা।
- Integration Testing: অ্যাপের ভিন্ন অংশের মধ্যে ইন্টিগ্রেশন পরীক্ষা করা।
- Asynchronous Testing: অ্যাপের অ্যাসিঙ্ক্রোনাস কার্যক্রমের জন্য অপেক্ষা করতে সক্ষম (যেমন নেটওয়ার্ক কল বা টাইমার)।
- Cross-platform Testing: iOS এবং Android প্ল্যাটফর্মের জন্য একযোগভাবে টেস্ট করতে পারে।
- Reliable and Fast: Detox পারফরম্যান্স এবং নির্ভরযোগ্যতার জন্য নির্মিত, যা আপনার E2E টেস্টিংকে দ্রুত এবং কার্যকরী করে।
Detox ইনস্টলেশন এবং কনফিগারেশন
Detox ইনস্টল করা:
Detox এর জন্য প্রথমে আপনাকে detox-cli ইনস্টল করতে হবে:npm install -g detox-cliঅথবা যদি আপনি yarn ব্যবহার করেন:
yarn global add detox-cliDetox Dependency ইনস্টলেশন:
আপনার React Native প্রোজেক্টে Detox যুক্ত করার জন্য নিম্নলিখিত প্যাকেজগুলি ইনস্টল করতে হবে:npm install detox --save-devঅথবা, yarn দিয়ে:
yarn add detox --deviOS এবং Android Build সেটআপ:
Detox সঠিকভাবে কাজ করার জন্য আপনার iOS এবং Android প্ল্যাটফর্মে অ্যাপ্লিকেশন বিল্ড করতে হবে।iOS:
আপনার Xcode প্রকল্পে Detox সেটআপ করতে CocoaPods ব্যবহার করুন:
cd ios && pod install && cd ..
Android:
- Android অ্যাপের জন্য Gradle কনফিগারেশন করতে হবে।
Detox কনফিগারেশন ফাইল তৈরি করা:
আপনারpackage.jsonফাইলে Detox কনফিগারেশন যুক্ত করুন:"detox": { "configurations": { "ios.sim.release": { "binaryPath": "ios/build/Build/Products/Release-iphonesimulator/myApp.app", "build": "xcodebuild -workspace ios/myApp.xcworkspace -scheme myApp -configuration Release -sdk iphonesimulator -derivedDataPath ios/build", "type": "ios.simulator" }, "android.emu.release": { "binaryPath": "android/app/build/outputs/apk/release/app-release.apk", "build": "cd android && ./gradlew assembleRelease && cd ..", "type": "android.emulator" } } }
Detox দিয়ে টেস্টিং শুরু করা
Detox ব্যবহার করে আপনার অ্যাপ্লিকেশনটিকে টেস্ট করতে কিছু স্টেপ অনুসরণ করতে হবে।
১. Test Suite তৈরি করা
Detox এ টেস্ট সাধারণত Jest এর সাথে লেখা হয়। আপনি আপনার টেস্ট ফোল্ডার তৈরি করে সেখানে টেস্ট কেস লিখতে পারেন।
উদাহরণ:
import { element, by, expect } from 'detox';
describe('App functionality', () => {
beforeAll(async () => {
await device.launchApp();
});
it('should show the welcome screen', async () => {
await expect(element(by.id('welcomeText'))).toBeVisible();
});
it('should tap the button', async () => {
await element(by.id('myButton')).tap();
await expect(element(by.id('nextScreen'))).toBeVisible();
});
});২. Detox Test Runner রান করা
Jest ব্যবহার করে Detox টেস্ট রান করতে, আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:
detox testঅথবা, Android এবং iOS প্ল্যাটফর্মে আলাদা টেস্ট চালানোর জন্য:
detox test --configuration ios.sim.release
detox test --configuration android.emu.release৩. App Launch and Cleanup
beforeAll() এবং afterAll() ফাংশন ব্যবহার করে অ্যাপ্লিকেশন লঞ্চ এবং ক্লিনআপ করতে হবে।
beforeAll(async () => {
await device.launchApp();
});
afterAll(async () => {
await device.reloadReactNative();
});Detox এর বৈশিষ্ট্য এবং টেস্ট স্টেপ
- Launch App:
device.launchApp()দিয়ে অ্যাপ্লিকেশন লঞ্চ করা হয়। - Element Interaction:
Detoxelement(by.id('elementId'))দ্বারা UI উপাদানের সাথে ইন্টারঅ্যাক্ট করে, যেমন টেক্সট বা বাটন প্রেস। - Assertions:
expect(element(by.id('elementId'))).toBeVisible()দিয়ে উপাদানের উপস্থিতি পরীক্ষা করা হয়। - Gestures:
Detox গেস্টার কনফিগারেশন (যেমন টিপ, স্লাইড, স্ক্রল ইত্যাদি) সমর্থন করে, যাতে ব্যবহারকারীর মতো আচরণ পরীক্ষা করা যায়। - Async Support:
Detox অ্যাসিঙ্ক্রোনাস টেস্টিং সাপোর্ট করে, যেমন নেটওয়ার্ক রিকোয়েস্ট বা সময়সীমা পার হওয়া।
সারাংশ
Detox একটি শক্তিশালী End-to-End Testing ফ্রেমওয়ার্ক যা React Native অ্যাপ্লিকেশনগুলির জন্য ডিজাইন করা হয়েছে। এটি আপনার অ্যাপের ফিচার এবং ইউজার ইন্টারঅ্যাকশন পরীক্ষা করতে সহায়ক। Detox-এর সাথে আপনি UI টেস্টিং, অ্যাসিঙ্ক্রোনাস ফাংশনালিটি, এবং বিভিন্ন প্ল্যাটফর্মে অটোমেটেড টেস্ট রান করতে পারবেন। Jest এর মাধ্যমে Detox টেস্ট লেখা সহজ এবং কার্যকর, এবং এটি iOS এবং Android উভয় প্ল্যাটফর্মে টেস্ট চালাতে সহায়ক।
Continuous Integration (CI) এবং Continuous Deployment (CD) হল সফটওয়্যার ডেভেলপমেন্টের দুটি গুরুত্বপূর্ণ পদ্ধতি, যা ডেভেলপারদের কোডের দ্রুত উন্নয়ন, পরীক্ষা এবং ডিপ্লয়মেন্টে সাহায্য করে। এই দুটি পদ্ধতি একে অপরের সাথে সম্পর্কিত এবং একে অপরকে পূর্ণ করে। তারা সফটওয়্যার ডেভেলপমেন্ট সাইকেলকে আরও দ্রুত, নির্ভরযোগ্য এবং অটোমেটেড করে তোলে।
Continuous Integration (CI)
Continuous Integration (CI) হল একটি ডেভেলপমেন্ট পদ্ধতি, যেখানে ডেভেলপাররা নিয়মিতভাবে (যেমন প্রতিদিন একাধিক বার) কোড রেপোজিটরিতে কমিট করে। এই প্রক্রিয়ায় automated build এবং automated tests ব্যবহার করা হয়, যাতে কোনো কোড পরিবর্তন সার্ভারে ইন্টিগ্রেট করার সময় তা তাত্ক্ষণিকভাবে পরীক্ষা করা যায়। এর মাধ্যমে একটি কোডবেসে নতুন কোড যোগ করার পর তাতে কোনো ধরনের সমস্যা (bug) রয়েছে কিনা তা দ্রুত খুঁজে বের করা যায়।
CI এর মূল বৈশিষ্ট্য:
- Automated Testing: নতুন কোড ইনটিগ্রেট করার পর এটি দ্রুত পরীক্ষিত হয়, যাতে কোডের নতুন অংশটি পূর্ববর্তী ফাংশনালিটিতে সমস্যা না সৃষ্টি করে।
- Frequent Commits: ডেভেলপাররা নিয়মিত কোড কমিট করে, যাতে সমস্যাগুলি তাড়াতাড়ি চিহ্নিত করা যায়।
- Early Detection of Errors: কোড ইন্টিগ্রেট করার সময় ত্রুটিগুলি দ্রুত সনাক্ত করা হয়, যাতে পরে সমস্যার সমাধান করা যায়।
- Version Control System (VCS): যেমন Git, ব্যবহার করা হয় কোড ইন্টিগ্রেশনের জন্য।
- Automated Build: কোডের প্রতিটি পরিবর্তন বা কমিট একটি স্বয়ংক্রিয় বিল্ড প্রসেস চালায়, যা কোডের নতুন সংস্করণ তৈরি করে।
CI এর উদাহরণ:
- Jenkins: একটি ওপেন সোর্স CI টুল যা কোডের বিল্ড, টেস্টিং এবং ডিপ্লয়মেন্ট অটোমেট করতে ব্যবহৃত হয়।
- Travis CI: GitHub এর সাথে ইন্টিগ্রেট করা একটি জনপ্রিয় CI টুল।
- CircleCI: ক্লাউড-বেসড এবং স্বয়ংক্রিয় বিল্ড ও টেস্টিং সিস্টেম।
CI এর সুবিধা:
- উন্নত কোড কোয়ালিটি।
- দ্রুত কোড ইন্টিগ্রেশন এবং সহজ সমন্বয়।
- ত্রুটি সমাধানের জন্য দ্রুত প্রতিক্রিয়া।
Continuous Deployment (CD)
Continuous Deployment (CD) হল একটি প্রক্রিয়া, যেখানে কোডের প্রতিটি পরিবর্তন স্বয়ংক্রিয়ভাবে প্রোডাকশন সার্ভারে ডিপ্লয় করা হয়। CD নিশ্চিত করে যে প্রতিটি পরিবর্তন বা ফিচার তারিখ অনুসারে সরাসরি গ্রাহকদের কাছে পৌঁছায়। এটি CI এর পরবর্তী স্তর হিসেবে কাজ করে, যেখানে CI টেস্ট সফলভাবে চললে, কোড স্বয়ংক্রিয়ভাবে ডিপ্লয়মেন্ট পিপলাইনে চলে যায় এবং প্রোডাকশন পরিবেশে চলে আসে।
CD এর মূল বৈশিষ্ট্য:
- Automated Deployment: টেস্ট পাস হওয়ার পর কোডটি স্বয়ংক্রিয়ভাবে প্রোডাকশন সার্ভারে ডিপ্লয় হয়।
- Rollback Capability: কোন ত্রুটি হলে আগের সংস্করণে ফিরে যাওয়ার জন্য অটোমেটেড রোলব্যাক ব্যবস্থা।
- Frequent Releases: নতুন ফিচার বা পরিবর্তনগুলো নিয়মিতভাবে গ্রাহকদের কাছে পৌঁছায়।
- High Velocity: নতুন কোড দ্রুত প্রোডাকশন পরিবেশে চলে আসে, যা অ্যাপ্লিকেশনের আপডেটের গতি বৃদ্ধি করে।
CD এর উদাহরণ:
- AWS CodePipeline: AWS সেবার একটি অংশ যা সি.ডি. পিপলাইনে ব্যবহৃত হয়।
- GitLab CI/CD: GitLab এর সি.ডি. এবং CI টুল ব্যবহার করে কোড ডিপ্লয়মেন্ট ও বিল্ড অটোমেট করতে পারে।
- Azure DevOps: মাইক্রোসফটের Azure প্ল্যাটফর্মে সি.ডি. সমাধান।
CD এর সুবিধা:
- Faster Releases: নতুন ফিচার এবং আপডেট গ্রাহকদের কাছে দ্রুত পৌঁছায়।
- Minimal Human Intervention: কোড ডিপ্লয়মেন্ট প্রক্রিয়াটি সম্পূর্ণ অটোমেটেড, কম মানুষের মুঠোফোনে।
- Quick Bug Fixes: প্রোডাকশন পরিবেশে দ্রুত ত্রুটি সমাধান সম্ভব।
CI এবং CD এর মধ্যে পার্থক্য
| CI (Continuous Integration) | CD (Continuous Deployment) |
|---|---|
| CI তে কোড কমিট করা হয় এবং এক্সটেনসিভ টেস্টিং করা হয়। | CD তে সফল টেস্টিংয়ের পর কোড সরাসরি প্রোডাকশন পরিবেশে চলে আসে। |
| প্রধান উদ্দেশ্য হল কোডের সমস্যা দ্রুত সনাক্ত করা। | প্রধান উদ্দেশ্য হল দ্রুত এবং সুশৃঙ্খলভাবে কোড প্রোডাকশনে ডিপ্লয় করা। |
| কোডের বিভিন্ন অংশ একত্রিত করে ত্রুটি সমাধান করা হয়। | স্বয়ংক্রিয়ভাবে কোড প্রোডাকশনে চলে যায়। |
| CI সাধারণত উন্নয়ন পরিবেশে সীমাবদ্ধ থাকে। | CD কোডকে প্রোডাকশনে বা গ্রাহকের কাছে সরাসরি পাঠানোর জন্য। |
CI এবং CD এর কাজের প্রক্রিয়া
- Continuous Integration:
- ডেভেলপার কোড রেপোজিটরিতে কমিট করে।
- CI সিস্টেম স্বয়ংক্রিয়ভাবে বিল্ড তৈরি করে এবং কোডটিতে পরীক্ষা চালায়।
- টেস্ট সফল হলে কোড ইন্টিগ্রেট করা হয়, নইলে ত্রুটি রিপোর্ট করা হয়।
- Continuous Deployment:
- CI পদ্ধতিতে সফল টেস্ট শেষে, কোডটি CD সিস্টেমে চলে যায়।
- CD সিস্টেম এটি স্বয়ংক্রিয়ভাবে প্রোডাকশন পরিবেশে ডিপ্লয় করে।
- প্রোডাকশনে কোনো ত্রুটি দেখা দিলে এটি আগের সংস্করণে ফিরে যেতে পারে (rollback)।
সারাংশ
- Continuous Integration (CI) এবং Continuous Deployment (CD) দুটি প্রক্রিয়া উন্নত এবং স্বয়ংক্রিয় সফটওয়্যার ডেভেলপমেন্ট সিস্টেম গড়ে তোলার জন্য অপরিহার্য।
- CI নিশ্চিত করে কোডের নতুন অংশ একত্রিত ও পরীক্ষা হচ্ছে, যাতে ত্রুটি দ্রুত সনাক্ত করা যায়।
- CD প্রতিটি কোড পরিবর্তন বা ফিচার প্রোডাকশনে অটোমেটিকভাবে ডিপ্লয় হয়, যার ফলে রিলিজের গতি অনেক বাড়ে।
এই দুটি প্রক্রিয়া একসাথে সফটওয়্যার ডেভেলপমেন্টকে আরও দ্রুত, নিরাপদ এবং নির্ভরযোগ্য করে তোলে।
Read more